﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace OffLineFilter
{
    public class ColorTextComparer
    {
        private List<List<Color>> firstText;
        private List<List<Color>> secondText;

        public ColorTextComparer(List<List<Color>> firstText, List<List<Color>> secondText)
        {
            this.firstText = firstText;
            this.secondText = secondText;
        }

        public double Compare()
        {
            // если тексты различаются по количеству предложений, от более длинного по высоте "изображения" нужно отрезать "хвост" и запомнить его
            int minSentencesCount = Math.Min(firstText.Count, secondText.Count);
            int maxSentencesCount = Math.Max(firstText.Count, secondText.Count);
            int N = maxSentencesCount - minSentencesCount;

            List<List<Color>> longestText = (firstText.Count > secondText.Count ? firstText : secondText);
            List<List<Color>> shortestText = (firstText.Count < secondText.Count ? firstText : secondText);
            List<List<Color>> tail = longestText.Skip(Math.Max(0, longestText.Count() - N)).Take(N).ToList();
            longestText.RemoveRange(longestText.Count - N - 1, N);

            int total = 0, matches = 0;
            for (int i = 0; i < shortestText.Count; i++)
            {
                List<Color> firstWords = firstText[i];
                List<Color> secondWords = secondText[i];

                int minWords = Math.Min(firstWords.Count, secondWords.Count);
                int maxWords = Math.Max(firstWords.Count, secondWords.Count);
                int d = maxWords - minWords;

                for (int j = 0; j < minWords; j++)
                {
                    if (firstWords[j] == secondWords[j])
                        matches++;
                    total++;
                }
                total += d;
            }

            total += tail.Select(words => words.Count).Sum();
            return (double)matches / (double)total;
        }

        public Bitmap GenerateBitmap()
        {
            Bitmap b = new Bitmap(800, 600);
            Graphics g = Graphics.FromImage(b);
            // если тексты различаются по количеству предложений, от более длинного по высоте "изображения" нужно отрезать "хвост" и запомнить его
            int minSentencesCount = Math.Min(firstText.Count, secondText.Count);
            int maxSentencesCount = Math.Max(firstText.Count, secondText.Count);
            int N = maxSentencesCount - minSentencesCount;

            List<List<Color>> longestText = (firstText.Count > secondText.Count ? firstText : secondText);
            List<List<Color>> shortestText = (firstText.Count < secondText.Count ? firstText : secondText);
            List<List<Color>> tail = longestText.Skip(Math.Max(0, longestText.Count() - N)).Take(N).ToList();
            longestText.RemoveRange(longestText.Count - N - 1, N);

            int w = 10, h = 10;
            int x, y = 2, padding = 2;
            for (int i = 0; i < shortestText.Count; i++)
            {
                x = 2;
                List<Color> firstWords = firstText[i];
                List<Color> secondWords = secondText[i];

                int minWords = Math.Min(firstWords.Count, secondWords.Count);
                int maxWords = Math.Max(firstWords.Count, secondWords.Count);
                int d = maxWords - minWords;

                for (int j = 0; j < minWords; j++)
                {
                    Color c;
                    if (firstWords[j] == secondWords[j])
                    {
                        c = Color.Lime;
                    }
                    else
                        c = Color.IndianRed;

                    Rectangle rect = new Rectangle(x, y, w, h);
                    g.DrawRectangle(new Pen(Color.Black, 1), rect);
                    g.FillRectangle(new SolidBrush(c), rect);
                    x += w + padding;
                }

                for (int j = 0; j < d; j++)
                {
                    Color c = Color.Orange;
                    Rectangle rect = new Rectangle(x, y, w, h);
                    g.DrawRectangle(new Pen(Color.Black, 1), rect);
                    g.FillRectangle(new SolidBrush(c), rect);
                    x += w + padding;
                }
                y += h + padding;
            }
            return b;
        }
    }
}
